package com.zy.explore.generator.infrastructure.core.frm;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.zy.explore.generator.infrastructure.core.enums.FrameworkTypeEnum;
import com.zy.explore.generator.infrastructure.core.vo.TableColumnVO;
import com.zy.explore.generator.infrastructure.core.vo.TableVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * description 生成代码参数DTO
 *
 * @author 🇨🇳中国印🇨🇳
 * @date 2021年04月15日 00:54
 */
@ApiModel("生成代码参数DTO")
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class BrickInfoFrm {

    /*****************************************  以下为页面所传参数 ******************************************/

    @ApiModelProperty(value = "表名称，用于搜索", example = "sys_user")
    private String tableName;

    @ApiModelProperty(value = "架构类型：0.DDD 1.DDD+Feign 2.常规MVC", allowableValues = "0,1,2", example = "1")
    @NotNull(message = "架构类型不能为空")
    private FrameworkTypeEnum frameworkType;

    @ApiModelProperty(value = "Mysql主机", example = "127.0.0.1")
    private String mysqlHost;
    @ApiModelProperty(value = "Mysql端口", example = "3306")
    private String mysqlPort;
    @ApiModelProperty(value = "Mysql用户名", example = "root")
    private String mysqlUser;
    @ApiModelProperty(value = "Mysql密码", example = "test123456")
    private String mysqlPwd;
    @ApiModelProperty(value = "Mysql数据库名称", example = "mysql")
    private String mysqlDb;

    /**
     * 属性说明：mysql的jdbc连接url
     *
     * @see String
     */
    @JsonIgnore
    private String mysqlUrl;

    /**
     * 前端可能传多个表来同时生成
     */
    @ApiModelProperty("表名集合")
    private List<String> tableNameList;

    @ApiModelProperty(value = "项目负责人名称", required = true, example = "🇨🇳中国印🇨🇳")
    private String authorName;

    @ApiModelProperty(value = "要去除的表名前缀", example = "t_")
    private String tableNamePrefix;

    @ApiModelProperty(value = "是否使用common组件 true:是 false:否", example = "false")
    private Boolean common;

    @ApiModelProperty(value = "基包", example = "com.zy.explore")
    private String basePackageName;

    @ApiModelProperty(value = "是否使用jpa true:是(默认) false:否", example = "true")
    private Boolean useJpa;

    @ApiModelProperty(value = "是否使用tk.mybatis true:是 false:否(默认)", example = "false")
    private Boolean useTkMybatis;

    @ApiModelProperty(value = "是否使用MybatisPlus true:是 false:否(默认)", example = "false")
    private Boolean useMybatisPlus;

    /**
     * 属性说明：前缀 如果同时使用jpa、tk.mybatis、mybatis-plus中任意两个及以上则需要前缀区分
     *
     * @see String
     */
    @JsonIgnore
    private String prefixJpa;
    @JsonIgnore
    private String prefixTk;
    @JsonIgnore
    private String prefixMp;
    /**
     * 属性说明：是否去除生成的上述3个前缀
     *
     * @see Boolean
     */
    @JsonIgnore
    private Boolean trimPrefix;

    /*****************************************  以上为页面所传参数 ******************************************/


    /*****************************************  以下为模板或文件夹所需参数 *************************************/
    @JsonIgnore
    private String codeRoot;

    private String feignCodeRoot;

    private String providerCodeRoot;

    @ApiModelProperty(value = "项目名称", example = "ddd-demo")
    private String projectName;

    /**
     * 时间
     */
    @JsonIgnore
    private String dateTime;

    /**
     * 表名对应的Java属性名称
     */
    @JsonIgnore
    private String propTableName;

    /**
     * 表对应的各种类名前缀
     */
    @JsonIgnore
    private String tableClassNamePrefix;

    /**
     * 主键的Java类型 常见的Integer、Long、String
     */
    @JsonIgnore
    private String pkType;

    /**
     * 主键的列名称
     */
    @JsonIgnore
    private String pkColumnName;

    /**
     * 主键的Java属性名称
     */
    @JsonIgnore
    private String pkPropName;

    /**
     * 主键的Java属性名称
     */
    @JsonIgnore
    private String pkPropNameFirstUpper;

    /**
     * 属性说明：表名大写下划线
     *
     * @see String
     */
    @JsonIgnore
    private String tableNameUpperCaseUnderline;

    /**
     * 基包绝对路径
     */
    @JsonIgnore
    private String basePackageAbsolutePath;

    /**
     * 文件名称(包含扩展名)
     */
    @JsonIgnore
    private String fileName;

    /**
     * 生成代码的表的信息
     */
    @JsonIgnore
    private TableVO tableVO;

    /**
     * 生成代码的表的列的信息
     */
    @JsonIgnore
    private List<TableColumnVO> tableColumns;

    /**
     * 单表的所有列名
     */
    @JsonIgnore
    private String allColumns;

    /**
     * 生成的Feign项目临时存放的根目录
     */
    @JsonIgnore
    private String projectFeignRoot;

    /*****************************************  以上为模板或文件夹所需参数 *************************************/
}
